package br.unisal.repository;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import br.unisal.domain.CPF;
import br.unisal.domain.Cliente;
import br.unisal.domain.Endereco;
import br.unisal.domain.Entregador;
import br.unisal.domain.FormaDePagamento;
import br.unisal.domain.ItemSolicitado;
import br.unisal.domain.Pedido;
import br.unisal.domain.Produto;

public class PedidoRepositoryTeste {

	private PedidoRepository pedidoRepository;
	private Pedido pedido1;
	private Pedido pedido2;
	private Cliente cliente;
	private Endereco endereco;
	private FormaDePagamento formaDePagamento;
	private ItemSolicitado itemSolicitado;
	private Produto produto;
	private List<ItemSolicitado> itens = new ArrayList<>();
	private List<Pedido> pedidos = new ArrayList<>();
	private Entregador entregador;
	
	@SuppressWarnings("static-access")
	@Before
	public void inicializa(){
		pedidoRepository = new PedidoRepository();
		endereco  = new Endereco("Maria", 223, "Sumare", "Capibaribe", "");
		cliente = new Cliente("3434", "Lucas", "Andrade", endereco);
		produto = new Produto(99, "teste", 9, "teste", 50.0, true);
		itemSolicitado = new ItemSolicitado(produto, 1);
		itens.add(itemSolicitado);
		pedido1 = new Pedido(cliente, itens, formaDePagamento.DINHEIRO);
		pedido2 = new Pedido(cliente, itens, formaDePagamento.DINHEIRO);
		pedidos = pedidoRepository.getPedidos();
		pedidos.add(pedido1);
		pedidos.add(pedido2);
		entregador = new Entregador("Aecio", "Alberonio", new CPF("1234567"));
	}
	
	@Test
	public void verificaStatusAtivoDoPedidoAoSerCriado() {
		Boolean ativo = false;
		for (Pedido pedidoFor : pedidos){
			if ( pedidoFor.equals(pedido1)){
				ativo = pedidoFor.isAtivo();
			}
		}
		assertEquals(true, ativo);
	}
	
	@Test
	public void verificaRetornaPedidosParaEnviarEmArray(){
		Pedido[] pedidos = pedidoRepository.retornaPedidosParaEnviarEmArray();
		Boolean pedidoLocalizado = false;
		for (Pedido pedidoFor : pedidos){
			if ( pedidoFor.equals(pedido1)){
				pedidoLocalizado = true;
			}
		}
		assertEquals(true, pedidoLocalizado);
	}
	
	@Test
	public void verificaStatusAtivoDoPedidoAoFechado(){
		pedidoRepository.alteraPedidoEntregador(pedido2.getCodigo(), entregador);
		pedidoRepository.desativaPedidoQuandoEntregadorRetorna(pedido2.getCodigo());
		Boolean ativo = true;
		for (Pedido pedidoFor : pedidos){
			if ( pedidoFor.equals(pedido2)){
				ativo = pedidoFor.isAtivo();
			}
		}
		assertEquals(false, ativo);
	}

	@Test
	public void verificaRetornaPedidosParaFecharEmArray(){
		Pedido[] pedidos = pedidoRepository.retornaPedidosParaEnviarEmArray();
		Boolean pedidoLocalizado = false;
		for (Pedido pedidoFor : pedidos){
			if ( pedidoFor.equals(pedido2)){
				pedidoLocalizado = true;
			}
		}
		assertEquals(true, pedidoLocalizado);
	}
	
	@Test
	public void verificaRetornoDeListaDePedidos(){
		List<Pedido> pedidos = new ArrayList<>();
		pedidos = pedidoRepository.getPedidos();
		assertEquals(true,  pedidos.contains(pedido1));
	}
	
	@Test
	public void verificaRemovePedidoPorCodigo(){
		Integer codigo = pedidoRepository.consultarPedido(pedido1).getCodigo();
		pedidoRepository.removePedidoPorCodigo(codigo);
		assertEquals(false,  pedidos.contains(pedido1));
	}
}
